package com.xhh.learning.record.分派.静态分派;


import java.io.Serializable;

/**
 * 重载的方法在编译过程中即可完成识别。具体到每一个方法调用，Java编译器会根据所传入参数的
 * 声明类型(注意与实际类型区分)来选取重载方法。选取的过程共分为三个阶段
 *
 * 1、在不考虑对基本类型自动装拆箱(auto- boxing，auto- unboxing)，以及可变长参数的情况
 * 下选取重载方法；
 *
 * 2、如果在第1个阶段中没有找到适配的方法，那么在允许自动装拆箱，但不允许可变长参数的情
 * 况下选取重载方法；
 *
 * 3、如果在第2个阶段中没有找到适配的方法，那么在允许自动装拆箱以及可变长参数的情况下选
 * 取重载方法。
 *
 * 如果Java编译器在同一个阶段中找到了多个适配的方法，那么它会在其中选择一个最为贴切的，
 * 而决定贴切程度的一个关键就是形式参数类型的继承关系。
 * 在开头的例子中，当传入nul时，它既可以匹配第一个方法中声明为 Object的形式参数，也可以
 * 匹配第
 * 方法中声明为 String的形式参数。由于 String是 Object的子类，因此Java编译器会
 * 认为第二个方法更为贴切。
 * 除了同一个类中的方法，重载也可以作用于这个类所继承而来的方法。也就是说，如果子类定义了
 * 与父类中非私有方法同名的方法，而且这两个方法的参数类型不同，那么在子类中，这两个方法同
 * 样构成了重载。
 *
 */
public class OverLoad {

    public static void load(Object arg) {
        System.out.println("Object");
    }

    public static void load(byte arg) {
        System.out.println("byte");
    }

    public static void load(boolean arg) {
        System.out.println("boolean");
    }

    public static void load(char arg) {
        System.out.println("char");
    }

    public static void load(Character arg) {
        System.out.println("Character");
    }

    public static void load(String arg) {
        System.out.println("String");
    }

    public static void load(int arg) {
        System.out.println("int");
    }

    public static void load(long arg) {
        System.out.println("long");
    }

    public static void load(float arg) {
        System.out.println("float");
    }

    public static void load(double arg) {
        System.out.println("double");
    }

    public static void load(int[] arg) {
        System.out.println("int[]");
    }

    public static void load(char...arg) {
        System.out.println("char[]");
    }

    public static void load(Serializable arg) {
        System.out.println("char[]");
    }

    public static void load(Serializable...arg) {
        System.out.println("char[]");
    }

    public static void main(String[] args) {
        load('a');
    }

}
